From 7f92e36da42d723299a17db69cc2b60abcddaa5f Mon Sep 17 00:00:00 2001 From: robertlipe Date: Sun, 13 Jan 2013 19:21:47 +0000 Subject: [PATCH] Remove st2gpx, declination, magxfer. They remain in sourceforget if you need them; they're not part of GPSBabel. --- CVSROOT/checkoutlist | 13 - CVSROOT/commitinfo | 15 - CVSROOT/config | 14 - CVSROOT/cvswrappers | 23 -- CVSROOT/editinfo | 21 - CVSROOT/loginfo | 26 -- CVSROOT/modules | 26 -- CVSROOT/notify | 12 - CVSROOT/rcsinfo | 13 - CVSROOT/taginfo | 20 - CVSROOT/verifymsg | 21 - declination/decline.c | 654 ------------------------------ magxfer/Makefile | 15 - magxfer/README | 44 -- magxfer/magxfer.c | 888 ----------------------------------------- st2gpx/Usage & FAQ.txt | 135 ------- st2gpx/libexpat.dll | Bin 143360 -> 0 bytes st2gpx/warning.txt | 16 - 18 files changed, 1956 deletions(-) delete mode 100644 CVSROOT/checkoutlist delete mode 100644 CVSROOT/commitinfo delete mode 100644 CVSROOT/config delete mode 100644 CVSROOT/cvswrappers delete mode 100644 CVSROOT/editinfo delete mode 100644 CVSROOT/loginfo delete mode 100644 CVSROOT/modules delete mode 100644 CVSROOT/notify delete mode 100644 CVSROOT/rcsinfo delete mode 100644 CVSROOT/taginfo delete mode 100644 CVSROOT/verifymsg delete mode 100644 declination/decline.c delete mode 100644 magxfer/Makefile delete mode 100644 magxfer/README delete mode 100644 magxfer/magxfer.c delete mode 100644 st2gpx/Usage & FAQ.txt delete mode 100644 st2gpx/libexpat.dll delete mode 100644 st2gpx/warning.txt diff --git a/CVSROOT/checkoutlist b/CVSROOT/checkoutlist deleted file mode 100644 index b04b3501f..000000000 --- a/CVSROOT/checkoutlist +++ /dev/null @@ -1,13 +0,0 @@ -# The "checkoutlist" file is used to support additional version controlled -# administrative files in $CVSROOT/CVSROOT, such as template files. -# -# The first entry on a line is a filename which will be checked out from -# the corresponding RCS file in the $CVSROOT/CVSROOT directory. -# The remainder of the line is an error message to use if the file cannot -# be checked out. -# -# File format: -# -# [] -# -# comment lines begin with '#' diff --git a/CVSROOT/commitinfo b/CVSROOT/commitinfo deleted file mode 100644 index b19e7b7a6..000000000 --- a/CVSROOT/commitinfo +++ /dev/null @@ -1,15 +0,0 @@ -# The "commitinfo" file is used to control pre-commit checks. -# The filter on the right is invoked with the repository and a list -# of files to check. A non-zero exit of the filter program will -# cause the commit to be aborted. -# -# The first entry on a line is a regular expression which is tested -# against the directory that the change is being committed to, relative -# to the $CVSROOT. For the first match that is found, then the remainder -# of the line is the name of the filter to run. -# -# If the repository name does not match any of the regular expressions in this -# file, the "DEFAULT" line is used, if it is specified. -# -# If the name "ALL" appears as a regular expression it is always used -# in addition to the first matching regex or "DEFAULT". diff --git a/CVSROOT/config b/CVSROOT/config deleted file mode 100644 index ff43ec005..000000000 --- a/CVSROOT/config +++ /dev/null @@ -1,14 +0,0 @@ -# Set this to "no" if pserver shouldn't check system users/passwords -#SystemAuth=no - -# Put CVS lock files in this directory rather than directly in the repository. -#LockDir=/var/lock/cvs - -# Set `TopLevelAdmin' to `yes' to create a CVS directory at the top -# level of the new working directory when using the `cvs checkout' -# command. -#TopLevelAdmin=no - -# Set `LogHistory' to `all' or `TOFEWGCMAR' to log all transactions to the -# history file, or a subset as needed (ie `TMAR' logs all write operations) -#LogHistory=TOFEWGCMAR diff --git a/CVSROOT/cvswrappers b/CVSROOT/cvswrappers deleted file mode 100644 index 0accaf1b1..000000000 --- a/CVSROOT/cvswrappers +++ /dev/null @@ -1,23 +0,0 @@ -# This file affects handling of files based on their names. -# -# The -t/-f options allow one to treat directories of files -# as a single file, or to transform a file in other ways on -# its way in and out of CVS. -# -# The -m option specifies whether CVS attempts to merge files. -# -# The -k option specifies keyword expansion (e.g. -kb for binary). -# -# Format of wrapper file ($CVSROOT/CVSROOT/cvswrappers or .cvswrappers) -# -# wildcard [option value][option value]... -# -# where option is one of -# -f from cvs filter value: path to filter -# -t to cvs filter value: path to filter -# -m update methodology value: MERGE or COPY -# -k expansion mode value: b, o, kkv, &c -# -# and value is a single-quote delimited value. -# For example: -#*.gif -k 'b' diff --git a/CVSROOT/editinfo b/CVSROOT/editinfo deleted file mode 100644 index d78886c15..000000000 --- a/CVSROOT/editinfo +++ /dev/null @@ -1,21 +0,0 @@ -# The "editinfo" file is used to allow verification of logging -# information. It works best when a template (as specified in the -# rcsinfo file) is provided for the logging procedure. Given a -# template with locations for, a bug-id number, a list of people who -# reviewed the code before it can be checked in, and an external -# process to catalog the differences that were code reviewed, the -# following test can be applied to the code: -# -# Making sure that the entered bug-id number is correct. -# Validating that the code that was reviewed is indeed the code being -# checked in (using the bug-id number or a seperate review -# number to identify this particular code set.). -# -# If any of the above test failed, then the commit would be aborted. -# -# Actions such as mailing a copy of the report to each reviewer are -# better handled by an entry in the loginfo file. -# -# One thing that should be noted is the the ALL keyword is not -# supported. There can be only one entry that matches a given -# repository. diff --git a/CVSROOT/loginfo b/CVSROOT/loginfo deleted file mode 100644 index 5a59f0a54..000000000 --- a/CVSROOT/loginfo +++ /dev/null @@ -1,26 +0,0 @@ -# The "loginfo" file controls where "cvs commit" log information -# is sent. The first entry on a line is a regular expression which must match -# the directory that the change is being made to, relative to the -# $CVSROOT. If a match is found, then the remainder of the line is a filter -# program that should expect log information on its standard input. -# -# If the repository name does not match any of the regular expressions in this -# file, the "DEFAULT" line is used, if it is specified. -# -# If the name ALL appears as a regular expression it is always used -# in addition to the first matching regex or DEFAULT. -# -# You may specify a format string as part of the -# filter. The string is composed of a `%' followed -# by a single format character, or followed by a set of format -# characters surrounded by `{' and `}' as separators. The format -# characters are: -# -# s = file name -# V = old version number (pre-checkin) -# v = new version number (post-checkin) -# -# For example: -#DEFAULT (echo ""; id; echo %s; date; cat) >> $CVSROOT/CVSROOT/commitlog -# or -#DEFAULT (echo ""; id; echo %{sVv}; date; cat) >> $CVSROOT/CVSROOT/commitlog diff --git a/CVSROOT/modules b/CVSROOT/modules deleted file mode 100644 index cb9e9efc9..000000000 --- a/CVSROOT/modules +++ /dev/null @@ -1,26 +0,0 @@ -# Three different line formats are valid: -# key -a aliases... -# key [options] directory -# key [options] directory files... -# -# Where "options" are composed of: -# -i prog Run "prog" on "cvs commit" from top-level of module. -# -o prog Run "prog" on "cvs checkout" of module. -# -e prog Run "prog" on "cvs export" of module. -# -t prog Run "prog" on "cvs rtag" of module. -# -u prog Run "prog" on "cvs update" of module. -# -d dir Place module in directory "dir" instead of module name. -# -l Top-level directory only -- do not recurse. -# -# NOTE: If you change any of the "Run" options above, you'll have to -# release and re-checkout any working directories of these modules. -# -# And "directory" is a path to a directory relative to $CVSROOT. -# -# The "-a" option specifies an alias. An alias is interpreted as if -# everything on the right of the "-a" had been typed on the command line. -# -# You can encode a module within a module by using the special '&' -# character to interpose another module into the current module. This -# can be useful for creating a module that consists of many directories -# spread out over the entire source repository. diff --git a/CVSROOT/notify b/CVSROOT/notify deleted file mode 100644 index 34f0bc288..000000000 --- a/CVSROOT/notify +++ /dev/null @@ -1,12 +0,0 @@ -# The "notify" file controls where notifications from watches set by -# "cvs watch add" or "cvs edit" are sent. The first entry on a line is -# a regular expression which is tested against the directory that the -# change is being made to, relative to the $CVSROOT. If it matches, -# then the remainder of the line is a filter program that should contain -# one occurrence of %s for the user to notify, and information on its -# standard input. -# -# "ALL" or "DEFAULT" can be used in place of the regular expression. -# -# For example: -#ALL mail %s -s "CVS notification" diff --git a/CVSROOT/rcsinfo b/CVSROOT/rcsinfo deleted file mode 100644 index 49e59f4d0..000000000 --- a/CVSROOT/rcsinfo +++ /dev/null @@ -1,13 +0,0 @@ -# The "rcsinfo" file is used to control templates with which the editor -# is invoked on commit and import. -# -# The first entry on a line is a regular expression which is tested -# against the directory that the change is being made to, relative to the -# $CVSROOT. For the first match that is found, then the remainder of the -# line is the name of the file that contains the template. -# -# If the repository name does not match any of the regular expressions in this -# file, the "DEFAULT" line is used, if it is specified. -# -# If the name "ALL" appears as a regular expression it is always used -# in addition to the first matching regex or "DEFAULT". diff --git a/CVSROOT/taginfo b/CVSROOT/taginfo deleted file mode 100644 index 274a46dd5..000000000 --- a/CVSROOT/taginfo +++ /dev/null @@ -1,20 +0,0 @@ -# The "taginfo" file is used to control pre-tag checks. -# The filter on the right is invoked with the following arguments: -# -# $1 -- tagname -# $2 -- operation "add" for tag, "mov" for tag -F, and "del" for tag -d -# $3 -- repository -# $4-> file revision [file revision ...] -# -# A non-zero exit of the filter program will cause the tag to be aborted. -# -# The first entry on a line is a regular expression which is tested -# against the directory that the change is being committed to, relative -# to the $CVSROOT. For the first match that is found, then the remainder -# of the line is the name of the filter to run. -# -# If the repository name does not match any of the regular expressions in this -# file, the "DEFAULT" line is used, if it is specified. -# -# If the name "ALL" appears as a regular expression it is always used -# in addition to the first matching regex or "DEFAULT". diff --git a/CVSROOT/verifymsg b/CVSROOT/verifymsg deleted file mode 100644 index 86f747ce2..000000000 --- a/CVSROOT/verifymsg +++ /dev/null @@ -1,21 +0,0 @@ -# The "verifymsg" file is used to allow verification of logging -# information. It works best when a template (as specified in the -# rcsinfo file) is provided for the logging procedure. Given a -# template with locations for, a bug-id number, a list of people who -# reviewed the code before it can be checked in, and an external -# process to catalog the differences that were code reviewed, the -# following test can be applied to the code: -# -# Making sure that the entered bug-id number is correct. -# Validating that the code that was reviewed is indeed the code being -# checked in (using the bug-id number or a seperate review -# number to identify this particular code set.). -# -# If any of the above test failed, then the commit would be aborted. -# -# Actions such as mailing a copy of the report to each reviewer are -# better handled by an entry in the loginfo file. -# -# One thing that should be noted is the the ALL keyword is not -# supported. There can be only one entry that matches a given -# repository. diff --git a/declination/decline.c b/declination/decline.c deleted file mode 100644 index 25fe6f0e7..000000000 --- a/declination/decline.c +++ /dev/null @@ -1,654 +0,0 @@ - -/* - Declination function - - Copyright (C) 2002 Robert Lipe, robertlipe@usa.net - - This program is free software; you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation; either version 2 of the License, or - (at your option) any later version. - - This program is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with this program; if not, write to the Free Software - Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111 USA - - */ -#include -#include -#include "defs.h" - -static double gh[]; - -#define STANDALONE - - -/* -These comments are from the original Fortran code from IGRF - - subroutine igrf9syn (isv,date,itype,alt,colat,elong,x,y,z,f) - c - c This is a synthesis routine for the 9th generation IGRF as agreed - c in July 2003 by IAGA Working Group V-8. It is valid 1900.0 to 2005.0 - c inclusive. Values for dates from 1945.0 to 2000.0 inclusive are - c definitve, otherwise they are non-definitive. - c INPUT - c isv = 0 if main-field values are required - c isv = 1 if secular variation values are required - c date = year A.D. Must be greater than or equal to 1900.0 and - c less than or equal to 2010.0. Warning message is given - c for dates greater than 2005.0. Must be double precision. - c itype = 1 if geodetic (spheroid) - c itype = 2 if geocentric (sphere) - c alt = height in km above sea level if itype = 1 - c = distance from centre of Earth in km if itype = 2 (>3485 km) - c colat = colatitude (0-180) - c elong = east-longitude (0-360) - c alt, colat and elong must be double precision. - c OUTPUT - c x = north component (nT) if isv = 0, nT/year if isv = 1 - c y = east component (nT) if isv = 0, nT/year if isv = 1 - c z = vertical component (nT) if isv = 0, nT/year if isv = 1 - c f = total intensity (nT) if isv = 0, rubbish if isv = 1 - c - c To get the other geomagnetic elements (D, I, H and secular - c variations dD, dH, dI and dF) use routines ptoc and ptocsv. - c - c Adapted from 8th generation version to include new maximum degree for - c main-field models for 2000.0 and onwards and use WGS84 spheroid instead - c of International Astronomical Union 1966 spheroid as recommended by IAGA - c in July 2003. Reference radius remains as 6371.2 km - it is NOT the mean - c radius (= 6371.0 km) but 6371.2 km is what is used in determining the - c coefficients. Adaptation by Susan Macmillan, August 2003. - */ - - double declination( double date, double alt, double lat, double lon ) { - - double cl[14]; - double sl[14]; - double p[106]; - double q[106]; - - double x = 0; - double y = 0; - double z = 0; - double f = 0; - - double colat = 90 - lat; - double elong = lon; - - double t; - double ll; - double one; - double two; - double three; - double rho; - double tc; - - double r; - double ct; - double st; - double cd; - double sd; - - double a2; - double b2; - double ratio; - double rr; - - double fn; - double gn; - double fm; - double gmm; - - int i; - int j; - int k; - int kmx; - int l; - int lm; - int m; - int n; - int nc; - int nmx; - - /* - c set initial values - */ - x = 0.0; - y = 0.0; - z = 0.0; - if ( date >= 1900 && date <= 2010 ) { - /* - if (date.gt.2005.0) write (6,960) date - 960 format (/' This version of the IGRF is intended for use up', - 1 ' to 2005.0.'/' values for',f9.3,' will be computed', - 2 ' but may be of reduced accuracy'/) - */ - if (date < 2000.0) { - t = 0.2*(date - 1900.0); - ll = t; - one = ll; - t = t - one; - if (date <= 1995.0) { - nmx = 10; - nc = nmx*(nmx+2); - ll = nc*ll; - kmx = (nmx+1)*(nmx+2)/2; - } - else { - nmx = 13; - nc = nmx*(nmx+2); - ll = 0.2*(date - 1995.0); - ll = 120*19 + nc*ll; - kmx = (nmx+1)*(nmx+2)/2; - } - tc = 1.0 - t; - } - else { - t = date - 2000.0; - tc = 1.0; - ll = 2475; - nmx = 13; - nc = nmx*(nmx+2); - kmx = (nmx+1)*(nmx+2)/2; - } - - r = alt; - one = colat*M_PI/180; - ct = cos(one); - st = sin(one); - one = elong*M_PI/180; - cl[1] = cos(one); - sl[1] = sin(one); - cd = 1.0; - sd = 0.0; - l = 1; - m = 1; - n = 0; - /* - c conversion from geodetic to geocentric coordinates - c (using the WGS84 spheroid) - */ - a2 = 40680631.6; - b2 = 40408296.0; - one = a2*st*st; - two = b2*ct*ct; - three = one + two; - rho = sqrt(three); - r = sqrt(alt*(alt + 2.0*rho) + (a2*one + b2*two)/three); - cd = (alt + rho)/r; - sd = (a2 - b2)/rho*ct*st/r; - one = ct; - ct = ct*cd - st*sd; - st = st*cd + one*sd; - - ratio = 6371.2/r; - rr = ratio*ratio; - /* - c computation of Schmidt quasi-normal coefficients p and x(=q) - */ - p[1] = 1.0; - p[3] = st; - q[1] = 0.0; - q[3] = ct; - for ( k = 2; k <= kmx; k++ ) { - if (n < m) { - m = 0; - n = n + 1; - rr = rr*ratio; - fn = n; - gn = n - 1; - } - fm = m; - if (m == n) { - if (k != 3) { - one = sqrt(1.0 - 0.5/fm); - j = k - n - 1; - p[k] = one*st*p[j]; - q[k] = one*(st*q[j] + ct*p[j]); - cl[m] = cl[m-1]*cl[1] - sl[m-1]*sl[1]; - sl[m] = sl[m-1]*cl[1] + cl[m-1]*sl[1]; - } - } - else { - gmm = m*m; - one = sqrt(fn*fn - gmm); - two = sqrt(gn*gn - gmm)/one; - three = (fn + gn)/one; - i = k - n; - j = i - n + 1; - p[k] = three*ct*p[i] - two*p[j]; - q[k] = three*(ct*q[i] - st*p[i]) - two*q[j]; - } - /* - c synthesis of x, y and z in geocentric coordinates - */ - lm = ll + l; - one = (tc*gh[lm] + t*gh[lm+nc])*rr; - if (m != 0) { - two = (tc*gh[lm+1] + t*gh[lm+nc+1])*rr; - three = one*cl[m] + two*sl[m]; - x = x + three*q[k]; - z = z - (fn + 1.0)*three*p[k]; - if (st != 0.0) { - y = y + (one*sl[m] - two*cl[m])*fm*p[k]/st; - } - else { - y = y + (one*sl[m] - two*cl[m])*q[k]*ct; - } - l = l + 2; - } - else { - x = x + one*q[k]; - z = z - (fn + 1.0)*one*p[k]; - l = l + 1; - } - m = m + 1; - } - /* - c conversion to coordinate system specified by itype - */ - one = x; - x = x*cd + z*sd; - - return 180/M_PI*atan2(y,x); - } - /* - c error return if date out of bounds - */ - /* - fatal ( "Can't compute declination for dates outside of 1900-2010\n" ); - */ - return 999; -} - - -#ifdef STANDALONE - int main(int c, char **v) { - double lat = atof(v[1]); - double lon = atof(v[2]); - double date = atof(v[3]); - double dec = declination( date, 0, lat, lon ); - printf( "declination is %f at %f,%f on %f\n\n", dec, lat, lon, date ); - return 0; - } -#endif - - -static double gh[] = { - 0, - /* 1900 */ - -31543.,-2298., 5922., -677., 2905.,-1061., 924., 1121., - 1022.,-1469., -330., 1256., 3., 572., 523., 876., - 628., 195., 660., -69., -361., -210., 134., -75., - -184., 328., -210., 264., 53., 5., -33., -86., - -124., -16., 3., 63., 61., -9., -11., 83., - -217., 2., -58., -35., 59., 36., -90., -69., - 70., -55., -45., 0., -13., 34., -10., -41., - -1., -21., 28., 18., -12., 6., -22., 11., - 8., 8., -4., -14., -9., 7., 1., -13., - 2., 5., -9., 16., 5., -5., 8., -18., - 8., 10., -20., 1., 14., -11., 5., 12., - -3., 1., -2., -2., 8., 2., 10., -1., - -2., -1., 2., -3., -4., 2., 2., 1., - -5., 2., -2., 6., 6., -4., 4., 0., - 0., -2., 2., 4., 2., 0., 0., -6., - /* 1905 */ - -31464.,-2298., 5909., -728., 2928.,-1086., 1041., 1065., - 1037.,-1494., -357., 1239., 34., 635., 480., 880., - 643., 203., 653., -77., -380., -201., 146., -65., - -192., 328., -193., 259., 56., -1., -32., -93., - -125., -26., 11., 62., 60., -7., -11., 86., - -221., 4., -57., -32., 57., 32., -92., -67., - 70., -54., -46., 0., -14., 33., -11., -41., - 0., -20., 28., 18., -12., 6., -22., 11., - 8., 8., -4., -15., -9., 7., 1., -13., - 2., 5., -8., 16., 5., -5., 8., -18., - 8., 10., -20., 1., 14., -11., 5., 12., - -3., 1., -2., -2., 8., 2., 10., 0., - -2., -1., 2., -3., -4., 2., 2., 1., - -5., 2., -2., 6., 6., -4., 4., 0., - 0., -2., 2., 4., 2., 0., 0., -6., - /* 1910 */ - -31354.,-2297., 5898., -769., 2948.,-1128., 1176., 1000., - 1058.,-1524., -389., 1223., 62., 705., 425., 884., - 660., 211., 644., -90., -400., -189., 160., -55., - -201., 327., -172., 253., 57., -9., -33., -102., - -126., -38., 21., 62., 58., -5., -11., 89., - -224., 5., -54., -29., 54., 28., -95., -65., - 71., -54., -47., 1., -14., 32., -12., -40., - 1., -19., 28., 18., -13., 6., -22., 11., - 8., 8., -4., -15., -9., 6., 1., -13., - 2., 5., -8., 16., 5., -5., 8., -18., - 8., 10., -20., 1., 14., -11., 5., 12., - -3., 1., -2., -2., 8., 2., 10., 0., - -2., -1., 2., -3., -4., 2., 2., 1., - -5., 2., -2., 6., 6., -4., 4., 0., - 0., -2., 2., 4., 2., 0., 0., -6., - /* 1915 */ - -31212.,-2306., 5875., -802., 2956.,-1191., 1309., 917., - 1084.,-1559., -421., 1212., 84., 778., 360., 887., - 678., 218., 631., -109., -416., -173., 178., -51., - -211., 327., -148., 245., 58., -16., -34., -111., - -126., -51., 32., 61., 57., -2., -10., 93., - -228., 8., -51., -26., 49., 23., -98., -62., - 72., -54., -48., 2., -14., 31., -12., -38., - 2., -18., 28., 19., -15., 6., -22., 11., - 8., 8., -4., -15., -9., 6., 2., -13., - 3., 5., -8., 16., 6., -5., 8., -18., - 8., 10., -20., 1., 14., -11., 5., 12., - -3., 1., -2., -2., 8., 2., 10., 0., - -2., -1., 2., -3., -4., 2., 2., 1., - -5., 2., -2., 6., 6., -4., 4., 0., - 0., -2., 1., 4., 2., 0., 0., -6., - /* 1920 */ - -31060.,-2317., 5845., -839., 2959.,-1259., 1407., 823., - 1111.,-1600., -445., 1205., 103., 839., 293., 889., - 695., 220., 616., -134., -424., -153., 199., -57., - -221., 326., -122., 236., 58., -23., -38., -119., - -125., -62., 43., 61., 55., 0., -10., 96., - -233., 11., -46., -22., 44., 18., -101., -57., - 73., -54., -49., 2., -14., 29., -13., -37., - 4., -16., 28., 19., -16., 6., -22., 11., - 7., 8., -3., -15., -9., 6., 2., -14., - 4., 5., -7., 17., 6., -5., 8., -19., - 8., 10., -20., 1., 14., -11., 5., 12., - -3., 1., -2., -2., 9., 2., 10., 0., - -2., -1., 2., -3., -4., 2., 2., 1., - -5., 2., -2., 6., 6., -4., 4., 0., - 0., -2., 1., 4., 3., 0., 0., -6., - /* 1925 */ - -30926.,-2318., 5817., -893., 2969.,-1334., 1471., 728., - 1140.,-1645., -462., 1202., 119., 881., 229., 891., - 711., 216., 601., -163., -426., -130., 217., -70., - -230., 326., -96., 226., 58., -28., -44., -125., - -122., -69., 51., 61., 54., 3., -9., 99., - -238., 14., -40., -18., 39., 13., -103., -52., - 73., -54., -50., 3., -14., 27., -14., -35., - 5., -14., 29., 19., -17., 6., -21., 11., - 7., 8., -3., -15., -9., 6., 2., -14., - 4., 5., -7., 17., 7., -5., 8., -19., - 8., 10., -20., 1., 14., -11., 5., 12., - -3., 1., -2., -2., 9., 2., 10., 0., - -2., -1., 2., -3., -4., 2., 2., 1., - -5., 2., -2., 6., 6., -4., 4., 0., - 0., -2., 1., 4., 3., 0., 0., -6., - /* 1930 */ - -30805.,-2316., 5808., -951., 2980.,-1424., 1517., 644., - 1172.,-1692., -480., 1205., 133., 907., 166., 896., - 727., 205., 584., -195., -422., -109., 234., -90., - -237., 327., -72., 218., 60., -32., -53., -131., - -118., -74., 58., 60., 53., 4., -9., 102., - -242., 19., -32., -16., 32., 8., -104., -46., - 74., -54., -51., 4., -15., 25., -14., -34., - 6., -12., 29., 18., -18., 6., -20., 11., - 7., 8., -3., -15., -9., 5., 2., -14., - 5., 5., -6., 18., 8., -5., 8., -19., - 8., 10., -20., 1., 14., -12., 5., 12., - -3., 1., -2., -2., 9., 3., 10., 0., - -2., -2., 2., -3., -4., 2., 2., 1., - -5., 2., -2., 6., 6., -4., 4., 0., - 0., -2., 1., 4., 3., 0., 0., -6., - /* 1935 */ - -30715.,-2306., 5812.,-1018., 2984.,-1520., 1550., 586., - 1206.,-1740., -494., 1215., 146., 918., 101., 903., - 744., 188., 565., -226., -415., -90., 249., -114., - -241., 329., -51., 211., 64., -33., -64., -136., - -115., -76., 64., 59., 53., 4., -8., 104., - -246., 25., -25., -15., 25., 4., -106., -40., - 74., -53., -52., 4., -17., 23., -14., -33., - 7., -11., 29., 18., -19., 6., -19., 11., - 7., 8., -3., -15., -9., 5., 1., -15., - 6., 5., -6., 18., 8., -5., 7., -19., - 8., 10., -20., 1., 15., -12., 5., 11., - -3., 1., -3., -2., 9., 3., 11., 0., - -2., -2., 2., -3., -4., 2., 2., 1., - -5., 2., -2., 6., 6., -4., 4., 0., - 0., -1., 2., 4., 3., 0., 0., -6., - /* 1940 */ - -30654.,-2292., 5821.,-1106., 2981.,-1614., 1566., 528., - 1240.,-1790., -499., 1232., 163., 916., 43., 914., - 762., 169., 550., -252., -405., -72., 265., -141., - -241., 334., -33., 208., 71., -33., -75., -141., - -113., -76., 69., 57., 54., 4., -7., 105., - -249., 33., -18., -15., 18., 0., -107., -33., - 74., -53., -52., 4., -18., 20., -14., -31., - 7., -9., 29., 17., -20., 5., -19., 11., - 7., 8., -3., -14., -10., 5., 1., -15., - 6., 5., -5., 19., 9., -5., 7., -19., - 8., 10., -21., 1., 15., -12., 5., 11., - -3., 1., -3., -2., 9., 3., 11., 1., - -2., -2., 2., -3., -4., 2., 2., 1., - -5., 2., -2., 6., 6., -4., 4., 0., - 0., -1., 2., 4., 3., 0., 0., -6., - /* 1945 */ - -30594.,-2285., 5810.,-1244., 2990.,-1702., 1578., 477., - 1282.,-1834., -499., 1255., 186., 913., -11., 944., - 776., 144., 544., -276., -421., -55., 304., -178., - -253., 346., -12., 194., 95., -20., -67., -142., - -119., -82., 82., 59., 57., 6., 6., 100., - -246., 16., -25., -9., 21., -16., -104., -39., - 70., -40., -45., 0., -18., 0., 2., -29., - 6., -10., 28., 15., -17., 29., -22., 13., - 7., 12., -8., -21., -5., -12., 9., -7., - 7., 2., -10., 18., 7., 3., 2., -11., - 5., -21., -27., 1., 17., -11., 29., 3., - -9., 16., 4., -3., 9., -4., 6., -3., - 1., -4., 8., -3., 11., 5., 1., 1., - 2., -20., -5., -1., -1., -6., 8., 6., - -1., -4., -3., -2., 5., 0., -2., -2., - /* 1950 */ - -30554.,-2250., 5815.,-1341., 2998.,-1810., 1576., 381., - 1297.,-1889., -476., 1274., 206., 896., -46., 954., - 792., 136., 528., -278., -408., -37., 303., -210., - -240., 349., 3., 211., 103., -20., -87., -147., - -122., -76., 80., 54., 57., -1., 4., 99., - -247., 33., -16., -12., 12., -12., -105., -30., - 65., -55., -35., 2., -17., 1., 0., -40., - 10., -7., 36., 5., -18., 19., -16., 22., - 15., 5., -4., -22., -1., 0., 11., -21., - 15., -8., -13., 17., 5., -4., -1., -17., - 3., -7., -24., -1., 19., -25., 12., 10., - 2., 5., 2., -5., 8., -2., 8., 3., - -11., 8., -7., -8., 4., 13., -1., -2., - 13., -10., -4., 2., 4., -3., 12., 6., - 3., -3., 2., 6., 10., 11., 3., 8., - /* 1955 */ - -30500.,-2215., 5820.,-1440., 3003.,-1898., 1581., 291., - 1302.,-1944., -462., 1288., 216., 882., -83., 958., - 796., 133., 510., -274., -397., -23., 290., -230., - -229., 360., 15., 230., 110., -23., -98., -152., - -121., -69., 78., 47., 57., -9., 3., 96., - -247., 48., -8., -16., 7., -12., -107., -24., - 65., -56., -50., 2., -24., 10., -4., -32., - 8., -11., 28., 9., -20., 18., -18., 11., - 9., 10., -6., -15., -14., 5., 6., -23., - 10., 3., -7., 23., 6., -4., 9., -13., - 4., 9., -11., -4., 12., -5., 7., 2., - 6., 4., -2., 1., 10., 2., 7., 2., - -6., 5., 5., -3., -5., -4., -1., 0., - 2., -8., -3., -2., 7., -4., 4., 1., - -2., -3., 6., 7., -2., -1., 0., -3., - /* 1960 */ - -30421.,-2169., 5791.,-1555., 3002.,-1967., 1590., 206., - 1302.,-1992., -414., 1289., 224., 878., -130., 957., - 800., 135., 504., -278., -394., 3., 269., -255., - -222., 362., 16., 242., 125., -26., -117., -156., - -114., -63., 81., 46., 58., -10., 1., 99., - -237., 60., -1., -20., -2., -11., -113., -17., - 67., -56., -55., 5., -28., 15., -6., -32., - 7., -7., 23., 17., -18., 8., -17., 15., - 6., 11., -4., -14., -11., 7., 2., -18., - 10., 4., -5., 23., 10., 1., 8., -20., - 4., 6., -18., 0., 12., -9., 2., 1., - 0., 4., -3., -1., 9., -2., 8., 3., - 0., -1., 5., 1., -3., 4., 4., 1., - 0., 0., -1., 2., 4., -5., 6., 1., - 1., -1., -1., 6., 2., 0., 0., -7., - /* 1965 */ - -30334.,-2119., 5776.,-1662., 2997.,-2016., 1594., 114., - 1297.,-2038., -404., 1292., 240., 856., -165., 957., - 804., 148., 479., -269., -390., 13., 252., -269., - -219., 358., 19., 254., 128., -31., -126., -157., - -97., -62., 81., 45., 61., -11., 8., 100., - -228., 68., 4., -32., 1., -8., -111., -7., - 75., -57., -61., 4., -27., 13., -2., -26., - 6., -6., 26., 13., -23., 1., -12., 13., - 5., 7., -4., -12., -14., 9., 0., -16., - 8., 4., -1., 24., 11., -3., 4., -17., - 8., 10., -22., 2., 15., -13., 7., 10., - -4., -1., -5., -1., 10., 5., 10., 1., - -4., -2., 1., -2., -3., 2., 2., 1., - -5., 2., -2., 6., 4., -4., 4., 0., - 0., -2., 2., 3., 2., 0., 0., -6., - /* 1970 */ - -30220.,-2068., 5737.,-1781., 3000.,-2047., 1611., 25., - 1287.,-2091., -366., 1278., 251., 838., -196., 952., - 800., 167., 461., -266., -395., 26., 234., -279., - -216., 359., 26., 262., 139., -42., -139., -160., - -91., -56., 83., 43., 64., -12., 15., 100., - -212., 72., 2., -37., 3., -6., -112., 1., - 72., -57., -70., 1., -27., 14., -4., -22., - 8., -2., 23., 13., -23., -2., -11., 14., - 6., 7., -2., -15., -13., 6., -3., -17., - 5., 6., 0., 21., 11., -6., 3., -16., - 8., 10., -21., 2., 16., -12., 6., 10., - -4., -1., -5., 0., 10., 3., 11., 1., - -2., -1., 1., -3., -3., 1., 2., 1., - -5., 3., -1., 4., 6., -4., 4., 0., - 1., -1., 0., 3., 3., 1., -1., -4., - /* 1975 */ - -30100.,-2013., 5675.,-1902., 3010.,-2067., 1632., -68., - 1276.,-2144., -333., 1260., 262., 830., -223., 946., - 791., 191., 438., -265., -405., 39., 216., -288., - -218., 356., 31., 264., 148., -59., -152., -159., - -83., -49., 88., 45., 66., -13., 28., 99., - -198., 75., 1., -41., 6., -4., -111., 11., - 71., -56., -77., 1., -26., 16., -5., -14., - 10., 0., 22., 12., -23., -5., -12., 14., - 6., 6., -1., -16., -12., 4., -8., -19., - 4., 6., 0., 18., 10., -10., 1., -17., - 7., 10., -21., 2., 16., -12., 7., 10., - -4., -1., -5., -1., 10., 4., 11., 1., - -3., -2., 1., -3., -3., 1., 2., 1., - -5., 3., -2., 4., 5., -4., 4., -1., - 1., -1., 0., 3., 3., 1., -1., -5., - /* 1980 */ - -29992.,-1956., 5604.,-1997., 3027.,-2129., 1663., -200., - 1281.,-2180., -336., 1251., 271., 833., -252., 938., - 782., 212., 398., -257., -419., 53., 199., -297., - -218., 357., 46., 261., 150., -74., -151., -162., - -78., -48., 92., 48., 66., -15., 42., 93., - -192., 71., 4., -43., 14., -2., -108., 17., - 72., -59., -82., 2., -27., 21., -5., -12., - 16., 1., 18., 11., -23., -2., -10., 18., - 6., 7., 0., -18., -11., 4., -7., -22., - 4., 9., 3., 16., 6., -13., -1., -15., - 5., 10., -21., 1., 16., -12., 9., 9., - -5., -3., -6., -1., 9., 7., 10., 2., - -6., -5., 2., -4., -4., 1., 2., 0., - -5., 3., -2., 6., 5., -4., 3., 0., - 1., -1., 2., 4., 3., 0., 0., -6., - /* 1985 */ - -29873.,-1905., 5500.,-2072., 3044.,-2197., 1687., -306., - 1296.,-2208., -310., 1247., 284., 829., -297., 936., - 780., 232., 361., -249., -424., 69., 170., -297., - -214., 355., 47., 253., 150., -93., -154., -164., - -75., -46., 95., 53., 65., -16., 51., 88., - -185., 69., 4., -48., 16., -1., -102., 21., - 74., -62., -83., 3., -27., 24., -2., -6., - 20., 4., 17., 10., -23., 0., -7., 21., - 6., 8., 0., -19., -11., 5., -9., -23., - 4., 11., 4., 14., 4., -15., -4., -11., - 5., 10., -21., 1., 15., -12., 9., 9., - -6., -3., -6., -1., 9., 7., 9., 1., - -7., -5., 2., -4., -4., 1., 3., 0., - -5., 3., -2., 6., 5., -4., 3., 0., - 1., -1., 2., 4., 3., 0., 0., -6., - /* 1990 */ - -29775.,-1848., 5406.,-2131., 3059.,-2279., 1686., -373., - 1314.,-2239., -284., 1248., 293., 802., -352., 939., - 780., 247., 325., -240., -423., 84., 141., -299., - -214., 353., 46., 245., 154., -109., -153., -165., - -69., -36., 97., 61., 65., -16., 59., 82., - -178., 69., 3., -52., 18., 1., -96., 24., - 77., -64., -80., 2., -26., 26., 0., -1., - 21., 5., 17., 9., -23., 0., -4., 23., - 5., 10., -1., -19., -10., 6., -12., -22., - 3., 12., 4., 12., 2., -16., -6., -10., - 4., 9., -20., 1., 15., -12., 11., 9., - -7., -4., -7., -2., 9., 7., 8., 1., - -7., -6., 2., -3., -4., 2., 2., 1., - -5., 3., -2., 6., 4., -4., 3., 0., - 1., -2., 3., 3., 3., -1., 0., -6., - /* 1995 */ - -29692.,-1784., 5306.,-2200., 3070.,-2366., 1681., -412., - 1335.,-2266., -262., 1248., 302., 758., -427., 940., - 780., 262., 290., -236., -418., 97., 122., -306., - -214., 352., 46., 235., 165., -118., -142., -166., - -55., -17., 107., 68., 67., -17., 68., 72., - -170., 67., 0., -58., 18., 1., -93., 36., - 77., -72., -69., 0., -25., 28., 4., 5., - 24., 4., 17., 8., -24., -2., -6., 25., - 6., 11., -6., -21., -9., 8., -14., -23., - 9., 14., 6., 11., -4., -16., -7., -4., - 4., 9., -20., 2., 15., -10., 12., 8., - -6., -8., -8., -1., 8., 10., 5., -2., - -8., -8., 3., -3., -6., 1., 2., 0., - -4., 4., -1., 5., 4., -5., 2., -1., - 2., -2., 5., 1., 1., -2., 0., -7., - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - /* 2000 */ - -29619.4,-1728.2, 5186.1,-2267.7, 3068.4,-2481.6, 1670.9, - -458.0, 1339.6,-2288.0, -227.6, 1252.1, 293.4, 714.5, - -491.1, 932.3, 786.8, 272.6, 250.0, -231.9, -403.0, - 119.8, 111.3, -303.8, -218.8, 351.4, 43.8, 222.3, - 171.9, -130.4, -133.1, -168.6, -39.3, -12.9, 106.3, - 72.3, 68.2, -17.4, 74.2, 63.7, -160.9, 65.1, - -5.9, -61.2, 16.9, 0.7, -90.4, 43.8, 79.0, - -74.0, -64.6, 0.0, -24.2, 33.3, 6.2, 9.1, - 24.0, 6.9, 14.8, 7.3, -25.4, -1.2, -5.8, - 24.4, 6.6, 11.9, -9.2, -21.5, -7.9, 8.5, - -16.6, -21.5, 9.1, 15.5, 7.0, 8.9, -7.9, - -14.9, -7.0, -2.1, 5.0, 9.4, -19.7, 3.0, - 13.4, -8.4, 12.5, 6.3, -6.2, -8.9, -8.4, - -1.5, 8.4, 9.3, 3.8, -4.3, -8.2, -8.2, - 4.8, -2.6, -6.0, 1.7, 1.7, 0.0, -3.1, - 4.0, -0.5, 4.9, 3.7, -5.9, 1.0, -1.2, - 2.0, -2.9, 4.2, 0.2, 0.3, -2.2, -1.1, - -7.4, 2.7, -1.7, 0.1, -1.9, 1.3, 1.5, - -0.9, -0.1, -2.6, 0.1, 0.9, -0.7, -0.7, - 0.7, -2.8, 1.7, -0.9, 0.1, -1.2, 1.2, - -1.9, 4.0, -0.9, -2.2, -0.3, -0.4, 0.2, - 0.3, 0.9, 2.5, -0.2, -2.6, 0.9, 0.7, - -0.5, 0.3, 0.3, 0.0, -0.3, 0.0, -0.4, - 0.3, -0.1, -0.9, -0.2, -0.4, -0.4, 0.8, - -0.2, -0.9, -0.9, 0.3, 0.2, 0.1, 1.8, - -0.4, -0.4, 1.3, -1.0, -0.4, -0.1, 0.7, - 0.7, -0.4, 0.3, 0.3, 0.6, -0.1, 0.3, - 0.4, -0.2, 0.0, -0.5, 0.1, -0.9, - /* 2002 */ - 13.3, 11.6, -21.2, -14.4, -3.7, -22.7, -3.6, -11.1, - -1.1, -3.5, 5.6, -1.2, -4.5, -8.5, -8.0, -2.7, - 2.2, 1.7, -8.0, 1.0, 4.5, 5.1, -1.9, -0.3, - -1.4, 0.7, -0.3, -2.6, 1.5, -1.2, 2.0, 0.0, - 3.8, -0.2, -0.5, 0.4, 0.3, -0.7, 0.7, -1.8, - 1.9, -0.2, -1.7, -0.4, -0.5, -0.2, 0.7, 1.5, - 0.2, -0.1, 0.7, -0.3, 0.3, 1.1, 0.1, 0.7, - 0.3, 0.5, -0.8, -0.3, -0.1, 0.5, 0.2, 0.1, - 0.2, -0.2, -0.5, 0.1, 0.2, 0.3, -0.4, 0.4, - 0.2, 0.1, 0.5, -0.3, -0.7, 0.4, 0.4, 0.4, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 - }; diff --git a/magxfer/Makefile b/magxfer/Makefile deleted file mode 100644 index 804c6ffbe..000000000 --- a/magxfer/Makefile +++ /dev/null @@ -1,15 +0,0 @@ -VERSIONU=1_2_0 -VERSIOND=1.2.0 - -all: magxfer - -magxfer: magxfer.c - $(CC) -o $@ $(CFLAGS) -DVERSION=\"$(VERSIOND)\" $< - -clean: - rm -f magxfer -release: - cvs tag -F magxfer_$(VERSIONU) - cvs export -r magxfer_$(VERSIONU) -d magxfer-$(VERSIOND) magxfer - tar cvzf /tmp/magxfer-$(VERSIOND).tar.gz magxfer-$(VERSIOND) - curl -u anonymous:anonymous --upload-file /tmp/magxfer-$(VERSIOND).tar.gz ftp://upload.sf.net/incoming/ diff --git a/magxfer/README b/magxfer/README deleted file mode 100644 index cf05f10d2..000000000 --- a/magxfer/README +++ /dev/null @@ -1,44 +0,0 @@ -Magxfer uploads detail and base maps to Magellan's mapping GPS receivers -under POSIX operating systems like UnixWare, OpenServer, Linux, FreeBSD, -Solaris, and OpenBSD. It is most useful on the 330 and SportTrak; -Meridians can just read the maps from the SD cards. - -It does **not** create or edit those maps; for that you must still -use Mapsend. But once you've used Mapsend to create the maps, you -may keep a collection of *.img files on your UNIX system and use this -utility to shoot them into your receiver. The files you need are in the -"export/images" in whatever location you installed Mapsend. - -Usage is simple: - - magxfer [-p portname] [-b bitrate] [-t type ] -f filetosend.img - - portname specifies the serial port to use. The default - is "/dev/ttyS0" which is the first serial port on a - Linux PC. - - bitrate specifies the speed to send the upload command. The - default is 4800. After connection is made, the actual - transfer happens at 115200 bps, regardless of this option. - - type can be d for detailed map or s for secondary base map such - as by Worldwide Basemap or p for primary basemap. Default - is d. - - Additionally, type can be h to specify a firmware - hex file containing srecords for upload on the unit. - See disclaimer below. - - filetosend.img is the image file you wish to upload to the unit. - -***FIRMWARE UPDATE DISCLAIMER*** - -Firmware upload has been tested on a SporTrak Pro in both normal mode -and in emergency upload mode initiated by pressing NAV+MENU while -turning the Sportrack ON. It is possible that this doesn't work on all -units. Failed firmware upgrades may require returning your unit to -Magellan for service which may or may not be covered under warranty. We -make no promise of any kind that firmware uploads will succeed. If your -unit croaks, it's your responsibility, not ours. - - diff --git a/magxfer/magxfer.c b/magxfer/magxfer.c deleted file mode 100644 index efe9a034e..000000000 --- a/magxfer/magxfer.c +++ /dev/null @@ -1,888 +0,0 @@ -/* - * Upload maps serially to Magellan GPS units. - * Detail maps: - * 330, SporTrak Map, SporTrak Map/Pro, Meridian Green/Yellow, Gold, Platinum. - * Base maps: - * All the above *except* Meridian Green and Yellow. The units with a 2MB - * base map have a different protocol used. - * - * Copyright 2003, 2004 by Robert Lipe. - * robertlipe@usa.net - */ - - -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include - - -#define xmalloc malloc -#define FRAME_SIZE 1000 - -int magfd; -int datatype = 1; -struct termios orig_tio; -struct termios new_tio; - -int debug_level = 0; -int synced; - -typedef struct { - unsigned int data_length; - unsigned char *data; -} vld; - -void dump_xframe(vld *frame); -void send_terminate(void); - -const char *usagestring = "\ -Usage: magxfer [-p portname] [-b bitrate] [-t type ] -f filetosend.img\n\ - portname port for uplkoad (default /dev/ttyS0)\n\ - bitrate bitrate (default is 4800)\n\ - type can be \n\ - s (secondary base map),\n\ - p (primary base map), or\n\ - d (detailed map)\n\ - h (firmware HEX file)\n\ - (default d)\n\ - filetosend.img is the image file you wish to upload to the unit\n"; -void -usage() -{ - fprintf(stderr, "\nmagxfer version " VERSION "\n"); - fprintf(stderr,"%s",usagestring); -} - -void -debug(const char *fmt, ...) -{ - va_list ap; - va_start(ap, fmt); - - if (0 == debug_level) - return; - - vfprintf(stderr, fmt, ap); -} - -/* - * Magellan uses a simple checksum of 16 bit words, but remember that - * things are optimized for the receiver, so they're big-endian. - */ -unsigned short -xor_checksum(unsigned char *p, int len) -{ - unsigned short data; - unsigned short checksum = 0; - int x; - - for (x = 0; x 0) { - if (debug_level >= 9) { - fprintf(stderr, ">%02x<", c); - } - return c; - } - } - fprintf(stderr, "Timeout. Unable to receive from GPS.\n"); - exit(1); -} - -int txs(const char *data, size_t n) -{ - if (debug_level >= 9) { - fprintf(stderr, "<%02x", *data); - if (n > 1) - fprintf(stderr, "..."); - fprintf(stderr, ">"); - } - return write(magfd, data, n); -} - -/* - * Certain things in the protocol return a 3 byte sequence - * starting with '0x8e'. We know when these will happen, so - * we read until we get the 0x8e and intuit that the next two - * bytes are the numeric value to be returned. - */ -int get3(void) -{ - int x1,x2,x3; - while ((x1 = rxc()) != 0x8e) - ; - - x2 = rxc(); - x3 = rxc(); - - return (x2 << 8) | x3; -} - -/* - * Transmit a single framt to the unit. - */ -size_t -xmit_xframe(vld *frame, unsigned int frame_number) -{ - int i; - unsigned int acked_frame; - - if (debug_level > 3) { - dump_xframe(frame); - } - - debug("Sending packet %d ", frame_number); - - if (frame->data_length == 6) { - int flen; - int unit_sum; - i = frame->data_length; - - txs(frame->data, i); - - unit_sum = get3(); - if (unit_sum != 0) { - fprintf(stderr, "Final checksum was 0x%x instead of 0.\n", unit_sum); - exit(1); - } - - flen = get3() << 16; - flen |= get3(); - return flen; - } - - - /* - * First wait for unit to send us an OK, a hello, or an "I'm waiting" - */ -retry_tx: - for (i = 0; (i = rxc()) ;) { - if (i == 0x55) break; - if (i == 0x77) break; - if (i == 0xaa) break; - } - - i = frame->data_length + 10; - if (debug_level > 3) { - int x ; - fprintf(stderr, "Writing\n"); - for (x=0; x< i;x++) { - fprintf(stderr, "%02x ", frame->data[x]); - } - fprintf(stderr, "<\n"); - } - txs(frame->data, i); - - if (datatype == 3 && frame_number == 0xffffffff) { - /* - * Do not wait for ACK for flash erase command - * We have to receive just a series of 0x87 for every - * block erased and two 0x55: one is the - * ACK for the frame and another for erase complete - */ - int cnt = 0; - int bcnt = 0; - char erase_command = 0x6a; - char ok = 0x55; - for (i = 0; i < 10; i++) { - unsigned char ch = rxc(); - if(ch == 0x55) { - cnt++; - if (cnt >= 2) - return 0; - } else if (ch == 0x8f) { - printf("\rBlock erase: %4d", bcnt++); - fflush(stdout); - i--; - } - } - for (i = 0; (i = rxc()) ;) { - if (i == 0x55) break; - if (i == 0xaa) break; - } - txs(&ok, 1); - for (i = 0; (i = rxc()) ;) { - if (i == 0x55) break; - } - txs(&erase_command, 1); - goto retry_tx; - } - - if (datatype == 4) { - for (i = 0; (i = rxc()) ;) { - if (i == 0x55) - return 0; - } - } - - /* - * Eat the 'OK' codes the unit spits out after the frame. - */ - for (i = 0; (i = rxc()) ;) { - if ((i != 0x55) && (i != 0xaa)) break; - } - - switch (i) { - case 0x77: - send_terminate(); - exit (1); - - case 0x81: - debug("Retransmitting frame %d\n", frame_number); - /* - * It's not documented, but the unit sends us two - * additional bytes in one of these. I'm guessing it's - * the checksum it computed. Read them and toss them. - */ - rxc(); - rxc(); - goto retry_tx; - - case 0x82: - debug( "Unit saw rec length > 1024. We sent %d\n", - frame->data[0] << 8 | frame->data[1]); - exit(1); - default: - abort(); - case 0x8e: - break; - } - acked_frame = rxc() << 24; - acked_frame |= rxc() << 16; - - for (i = 0; (i = rxc()) ;) { - if ((i != 0x55) && (i != 0xaa)) break; - } - if (i == 0x77) send_terminate(); - - if (i != 0x8e) abort(); - acked_frame |= rxc() << 8; - acked_frame |= rxc(); - - /* - * The spec is actually wrong on this. It doesn't ack the frame - * we just sent. The ack contains the next frame it wants. - * This has been confirmed by Magellan Engineering. - */ - if (acked_frame != frame_number + 1) { - fprintf(stderr, "Got ack for %x. Expected %x\n", - acked_frame, frame_number); - abort(); - } - - debug("Acked.\n"); - - return 0; -} - -/* - * Display a frame in human-readable format. - */ -void -dump_xframe(vld *frame) -{ - unsigned int i; - unsigned int edata = frame->data_length + 7; - unsigned int words; - unsigned int recnum; - unsigned int checksum; - - assert(frame->data[0] == '['); - debug("%x ", frame->data[0]); - - if (frame->data_length == 6) { - debug("TERMINATION FRAME: "); - for (i = 0; i < frame->data_length; i++) { - debug("%02x ", frame->data[i]); - } - return; - } - words = (frame->data[1] << 8) | frame->data[2]; - debug("Words: %04x ", words); - - recnum = (frame->data[3] << 24) | (frame->data[4] << 16) | - (frame->data[5] << 8) | (frame->data[6]); - - debug("Recnum: %08x\n", recnum); - - for (i = 0; i < frame->data_length; i++) { - debug("%02x ", frame->data[i+7]); - } - checksum = (frame->data[edata] << 8) | frame->data[edata+1]; - debug("Checksum: %04x ", checksum); -/* assert(0 == xor_checksum(&frame->data[3], frame->data_length + 4)); */ - assert(frame->data[edata+2] == ']'); - debug(" %x\n\n", frame->data[edata+2]); -} - -/* - * Prepare a packet for transmission by adding framing, checksum, etc. - */ -vld * -make_xframe(void *data, int len, unsigned int recno) -{ - vld *odata = xmalloc(sizeof *odata); - unsigned int words; - unsigned int aligned_len; - unsigned int checksum; - - /* - * Special case for termination. - */ - if (len == 0) { - odata->data = xmalloc(6); - odata->data[0] = '['; - odata->data[1] = 0; - odata->data[2] = 0; - odata->data[3] = 0; - odata->data[4] = 0; - odata->data[5] = ']'; - odata->data_length = 6; - return odata; - } - - /* Round to even word alignment */ - - aligned_len = (len + 1) & ~1; - words = (4 + aligned_len) / 2; - - odata->data = xmalloc(aligned_len + 9); - odata->data_length = aligned_len; - - odata->data[0] = '['; - - odata->data[1] = words >> 8; - odata->data[2] = words; - assert(words <= 1024); - - odata->data[3] = recno >> 24; - odata->data[4] = recno >> 16; - odata->data[5] = recno >> 8; - odata->data[6] = recno; - - /* If we had to insert padding, this ensures it's zero. If we - * didn't, it'll get clobbered by the memcpy which is fine. - */ - odata->data[aligned_len + 6] = 0; - memcpy(&odata->data[7], data, len); - - checksum = xor_checksum(&odata->data[3], aligned_len + 4); - odata->data[aligned_len + 7] = checksum >> 8; - odata->data[aligned_len + 8] = checksum; - odata->data[aligned_len + 9] = ']'; - - return odata; -} - -void free_xframe(vld *frame) -{ - free(frame->data); - free(frame); -} - -/* - * Something Very Bad has happened. Send a zero-length frame to the unit - * to tell it we're through playin' now. - */ -void -send_terminate(void) -{ - vld* vld; - - fprintf(stderr, "Hopelessly confused. Terminating upload.\n"); - - vld = make_xframe(NULL, 0, 0); - xmit_xframe(vld, 0); - exit(1); -} - - -/* - * Send 'sz' bytes from buf to the unit, chunking it up, framing it, and - * retransmitting chunks as needed. - */ -size_t -xmit(char *buf, int sz) -{ - int frame_number = 0; - int left = sz; - int n; - vld* vld; - - for (n = 0; n < sz - FRAME_SIZE; n += FRAME_SIZE,frame_number++) { - vld = make_xframe(&buf[n], FRAME_SIZE, frame_number); - printf("\r%3.02f%% done", 100.0 * ((double) n / (double) sz)); - xmit_xframe(vld, frame_number); - left -= FRAME_SIZE; - } - - if (left > 0) { - vld = make_xframe(&buf[n], left, frame_number); - xmit_xframe(vld, frame_number); - } - - vld = make_xframe(&buf[0], 0, frame_number++); - printf("\r100.00%% done\n"); - return xmit_xframe(vld, frame_number); -} - - -/* - * Given a numeric bitrate input, return a speed_t suitable for - * stuffing into a termios. - */ -speed_t -mkspeed(unsigned br) -{ - switch (br) { - case 1200: return B1200; - case 2400: return B2400; - case 4800: return B4800; - case 9600: return B9600; - case 19200: return B19200; -#if defined B57600 - case 57600: return B57600; -#endif -#if defined B115200 - case 115200: return B115200; -#endif - default: return B4800; - } -} - -void -restore_port() -{ - if (magfd) { - sleep(1); - tcsetattr(magfd, TCSAFLUSH, &orig_tio); - sleep(1); - close(magfd); - magfd = 0; - } -} - -/* - * - */ -void -setup_port(const char *portname, unsigned bitrate) -{ - char clean_buff[256]; - magfd = open (portname, O_RDWR); - - if (magfd < 0) { - fprintf(stderr, "Unable to open '%s'. Error: %s\n", - portname, strerror(errno)); - exit(1); - } - - tcgetattr(magfd, &orig_tio); - atexit(restore_port); - new_tio = orig_tio; - new_tio.c_iflag &= ~(IGNBRK|BRKINT|PARMRK|ISTRIP|INLCR| - IGNCR|ICRNL|IXON); - new_tio.c_oflag = 0; - new_tio.c_lflag = 0; - new_tio.c_cflag &= ~(CSIZE|PARENB); - new_tio.c_cflag |= CS8; - new_tio.c_cc[VTIME] = 10; - new_tio.c_cc[VMIN] = 0; - cfsetospeed(&new_tio, mkspeed(bitrate)); - cfsetispeed(&new_tio, mkspeed(bitrate)); - tcsetattr(magfd, TCSAFLUSH, &new_tio); - while(read(magfd,clean_buff,sizeof(clean_buff)) == sizeof(clean_buff)) - /* Read until buffer is empty */; -} - - -/* - * It might seem underambitious, but we really only need to send - * one command to the unit and we won't even get an ack back, so we - * just sort of spray it out there as a constant and hope to rendezvous - * soon. While the spec doesn't say it, we rendezvous at 115.2K, so we - * slam the local port to that speed immediately after we've written - * the data. - */ -void -send_upload_cmd(void) -{ - static const char *cmd[] = { - "$PMGNCMD,MPUPLOAD,1*71\r\n", - "$PMGNCMD,MPUPLOAD,2*72\r\n", - "$PMGNCMD,MPUPLOAD,3*73\r\n", - "$PMGNCMD,DBUPLOAD*77\r\n", - "" - }; - txs(cmd[datatype], strlen(cmd[datatype])); - if (datatype == 4 ) { - cfsetospeed(&new_tio, B19200); - cfsetispeed(&new_tio, B19200); - } else { - cfsetospeed(&new_tio, B115200); - cfsetispeed(&new_tio, B115200); - } - tcsetattr(magfd, TCSADRAIN, &new_tio); -} - -void -alarm_handler(int a) -{ - if (synced) { - signal(SIGALRM, SIG_DFL); - return; - } - fprintf(stderr, "Fatal error: No communications %d.\n", magfd); - exit(1); - -} - -/* - * Listen for "hello" packets from the unit. If found, the rendezvous must - * have succeeded so we send back a "hello". - */ -void -sync_receiver(void) -{ - int i; - char c = 0x55; - - signal(SIGALRM, alarm_handler); - alarm(10); - - synced = 0; - for (i = 0;synced == 0;) { - switch (i = rxc()) { - case 0: break; - case 0xaa: synced=1; - case 0x77: synced=1; - } - } - - txs(&c, 1); - - /* - * The spec says we shouldn't have to wait again, but this makes - * the communications setup way more reliable. - */ - synced = 0; - for (i = 0;synced == 0;) { - switch (i = rxc()) { - case 0: break; - case 0xaa: synced=1; - case 0x77: synced=1; - case 0x55: synced=1; // For firmware upload - } - } -} - -/* Stuff for dealing with S-records file used for firmware distribution */ - -#define STRSIZE 1024 -#define SRECSIZE STRSIZE/2 - -struct srec { - int length; - unsigned long address; - unsigned char data[SRECSIZE]; -}; - -static char *fname; - -int hex(int ch) -{ - ch &= 0xff; - - if ((ch >= 'A') && (ch <= 'F')) - return ch - 'A' + 10; - else if ((ch >= 'a') && (ch <= 'f')) - return ch - 'a' + 10; - else if ((ch >= '0') && (ch <= '9')) - return ch - '0'; - else - /* WARNING: This can be machine dependent. - We assume that -1 is represented as 0xffffffff - so if there is any error in a input hex format - the output from this function and sbyte below - will be -1 */ - return -1; -} - -int sbyte (char *ptr) -{ - return (hex(*ptr++) << 4) | hex(*ptr); -} - -int get_srec(char *string, struct srec *srec) -{ - char *ptr; - unsigned char *sptr; - int length; - int type; - int data; - int chksum; - - while (ptr = strchr(string, '\r')) - memmove(ptr, ptr+1, strlen(ptr+1)); - if (ptr = strchr(string, '\n')) - *ptr = 0; - ptr = string; - while(*ptr == ' ' || *ptr == '\t') - ptr++; - if (*ptr++ != 'S') - return 0; - if ((type = hex(*ptr++)) != 3) - return 0; - if (((length = sbyte(ptr)) < 0) || (length > SRECSIZE-1-4)) - return -1; - ptr += 2; - if (length != strlen(ptr)/2) - return -2; - - chksum = length; - data = sbyte(ptr); - chksum += data; - srec->address = data << 24; - ptr += 2; - data = sbyte(ptr); - chksum += data; - srec->address |= data << 16; - ptr += 2; - data = sbyte(ptr); - chksum += data; - srec->address |= data << 8; - ptr += 2; - data = sbyte(ptr); - chksum += data; - srec->address |= data; - ptr += 2; - - if (srec->address == -1U) - return -3; - - length -= 4; - sptr = &srec->data[0]; - while (length > 1) { - if ((data = sbyte(ptr)) == -1) - return -4; - chksum += data; - ptr += 2; - *sptr++ = data; - length--; - } - - chksum += sbyte(ptr); - chksum++; - if (chksum & 0xff) - return -5; - srec->length = (int)(sptr - &srec->data[0]); - if (srec->address == 0) - printf("%s\n", string); - return srec->length; -} - -void flash_erase(unsigned long min_address, unsigned long max_address) -{ - unsigned char data[4]; - vld *frame; - char erase_command = 0x6a; - - data[0] = (max_address >> 24) & 0xff; - data[1] = (max_address >> 16) & 0xff; - data[2] = (max_address >> 8) & 0xff; - data[3] = max_address & 0xff; - - frame = make_xframe(data, 4, min_address); - txs(&erase_command, 1); - xmit_xframe(frame, 0xffffffff); - free_xframe(frame); -} - -void flash_program(unsigned long address, unsigned long length, char *buff) -{ - vld *frame; - if (length > 0) { - if (datatype == 3) { - frame = make_xframe(buff, length, address); - } else { - unsigned long first4bytes; - first4bytes = (*buff++ << 24) & 0xff000000; - first4bytes |= (*buff++ << 16) & 0x00ff0000; - first4bytes |= (*buff++ << 8) & 0x0000ff00; - first4bytes |= *buff++ & 0x000000ff; - frame = make_xframe(buff, length-4, first4bytes); - } - printf("\rProgramming %4d bytes at address: %08x", length, address); - fflush(stdout); - xmit_xframe(frame, address-1); - free_xframe(frame); - } -} - -void flash_end (void) -{ - vld *frame; - frame = make_xframe(NULL, 0, 0); - txs(frame->data, 6); - free_xframe(frame); -} - -void firmware_upload (FILE *infile, char *buffer) -{ - FILE *outfile; - char string[STRSIZE]; - struct srec srec; - unsigned long min_address,max_address; - unsigned long current_address = 0; - unsigned long frag_length = 0; - int rc; - - min_address = 0xffffffff; - max_address = 0x0; - while(fgets(string, sizeof(string)-1, infile)) { - if ((rc = get_srec(string, &srec)) == 0) - continue; - else if (rc < 0) { - fprintf(stderr, "Wrong record: %s\n", string); - exit(-3); - } - if ((srec.address + srec.length) > max_address) - max_address = srec.address + srec.length; - if (srec.address < min_address) - min_address = srec.address; - } - printf("Lowest address = %08X, Highest address = %08X\n", min_address, max_address); - fseek(infile, 0, 0); - if (datatype == 3) { - flash_erase(min_address, max_address); - printf("\n"); - } - while(fgets(string, sizeof(string)-1, infile)) { - if ((rc = get_srec(string, &srec)) <= 0) - continue; - if ((srec.address != current_address + frag_length) || (frag_length + srec.length > 1024)) { - flash_program(current_address, frag_length, buffer); - frag_length = 0; - current_address = srec.address; - } - memcpy(buffer + frag_length, &srec.data[0], srec.length); - frag_length += srec.length; - } - flash_program(current_address, frag_length, buffer); - printf("\n"); - flash_end(); - fclose(infile); - exit(0); -} - -int -main(int argc, char *argv[]) -{ - static char ibuf[64*1024*1024]; - unsigned short cksum; - size_t file_sz; - size_t sent_sz; - FILE *inf; - int c; - unsigned bitrate = 4800; - const char *portname = "/dev/ttyS0"; - const char *ifilename = NULL; - - - while ((c = getopt(argc, argv, "t:f:p:b:D:")) != EOF) { - switch(c) { - case 't': - if (strcmp(optarg,"s") == 0) - datatype = 2; - else if (strcmp(optarg,"d") == 0) - datatype = 1; - else if (strcmp(optarg,"p") == 0) - datatype = 0; - else if (strcmp(optarg,"h") == 0) - datatype = 3; - else if (strcmp(optarg,"c") == 0) - datatype = 4; - else { - fprintf(stderr,"Map or file type (-t option) can only be 'd', 'p', 's' or 'h'\n"); - exit(1); - } - break; - case 'p': - portname = optarg; - break; - case 'f': - ifilename = optarg; - break; - case 'D': - debug_level = atoi(optarg); - break; - case 'b': - bitrate = atoi(optarg); - break; - default: - usage(); - exit(1); - break; - } - } - if (!ifilename) { - fprintf(stderr, "No input file specified. Exiting.\n"); - usage(); - exit(1); - } - setup_port(portname, bitrate); - send_upload_cmd(); - sync_receiver(); - - inf = fopen(ifilename, "r"); - if (!inf) { - perror(ifilename); - exit(1); - } - if ((datatype == 3) || (datatype == 4)) { - firmware_upload(inf,ibuf); - } - file_sz = fread(ibuf, 1, sizeof(ibuf), inf); - if (file_sz == sizeof(ibuf)) { - fprintf(stderr, "File '%s' bigger than %d bytes. Exiting.\n", - ifilename, sizeof(ibuf)); - exit(1); - } - - cksum = xor_checksum(ibuf, file_sz); - ibuf[file_sz++] = cksum >> 8; - ibuf[file_sz++] = cksum ; - - sent_sz = xmit(ibuf, file_sz); - if (sent_sz != file_sz) { - fprintf(stderr, "We sent %d bytes but the unit saw %d\n", - sent_sz, file_sz); - exit(1); - } - - return 0; -} diff --git a/st2gpx/Usage & FAQ.txt b/st2gpx/Usage & FAQ.txt deleted file mode 100644 index b36dc25c4..000000000 --- a/st2gpx/Usage & FAQ.txt +++ /dev/null @@ -1,135 +0,0 @@ -st2gpx - Export/import data from MS Streets & Trips, Autoroute and Mappoint files to GPX format - -By James Sherring, james_sherring@yahoo.com - -******************************************************************************************** - -WARNING -******* -ms2gpx could corrupt Microsoft Streets & Trips, Autoroute and Mappoint files. -ms2gpx is based on my (James Sherring) limited understanding and guessing of Microsoft file formats. -These file formats are undocumented, vary between products and versions, and certainly have information -that I do not understand. - -There is no guarantee that this program will work correctly. -It is possible that it will import or export data erroneously, -corrupt your data files, -that files modified by st2gpx will crash applications using them, -or that there will be other loss of data or other effects. - -It is recommended that you backup any data before using this program. - -Usage of this program indicates that you understand this risk and assume all responsibility for your data. - -******************************************************************************************** - -Usage: st2gpx [-hr] [-v verbose-level] [-g gpx-in-file] [-G gpx-out-file] - [-m mpst-in-file] [-M pcx5-out-file] [-F st-mod-file] stfile - --h : Help (this text) --r : Export drawn-lines as routes instead of tracks --g gpx-in-file : Import data from GPX XML format gpx-in-file --G gpx-out-file : Write output to GPX XML format gpx-out-file --F st-mod-file : Write modified stfile with imported data - to (new) st-mod-file. --m mpst-in-file : Import data from Garmin MapSource text-export mpst-in-file --M pcx5-out-file : Write output to Garmin MapSource importable pcx5-out-file - -export hint: st2gpx stfile (or use drag & drop) -import hint: st2gpx -g gpx-in-file -F st-mod-file st-template-file - -Debugging options: --e : Explore data further --v [n] : Set debugging verbosity to 'n' (0-6, default 2) --u userdata-file : Process pushpins in (mdb) file userdata-file --j journey-file : Process Journey in file journey-file --a annotations-file : Process Annotations in file annotations-file --p properties-file : Analyse OLE properties-file - - -FAQ ---- - -Q What is st2gpx for? - -A I wanted to draw tracks from my GPS in Autoroute to see where I had been. - And I wanted to download data from Autoroute to my GPS. - - st2gpx is used for converting data in Microsoft Map (Streets & Trips, Autoroute and Mappoint) format - to a usable data format. GPX is becoming the standard format for GPS data. GPSBabel can convert GPX data - into many other data formats. - - -Q Is there a GUI version? - -A Sorry, not yet. - - -Q What can st2gpx do that you cant do with import/export in Microsoft Map (Streets & Trips, Autoroute and Mappoint)? - -A st2gpx can import and export poly-lines. Streets & Trips and Autoroute cant do this, and Mappoint needs - to be programmed to achieve this. Normally Streets & Trips and Autoroute only import pushpins. - (st2gpx can also import/export pushpins and export the driving route.) - - -Q How do I save a GPS track or other GPX data from Streets & Trips, Autoroute or Mappoint? - -A First create the data you want in Streets & Trips, Autoroute or Mappoint. - This can include pushpins, route, and poly-lines. It does not include driving instructions or drawing shapes - other than poly-lines. - Then the command is: - st2gpx input-file-name - input-file-name is your existing Streets & Trips, Autoroute or Mappoint file; - The data will be exported into a file of the same name with the extension .gpx - (you can specify the name of the output file with the -G option) - You can use GPSBabel or other programs with this data. - - -Q How do I import a GPS track or other GPX data into Streets & Trips, Autoroute or Mappoint? - -A First you need to have the data in GPX format - see GPSBabel for that. - Then you need to chose your import file, it can be a template map or one with your existing data in it. - Be sure to backup this file! Then the command is: - st2gpx -g gpx-in-file -F output-file-name input-file-name - where gpx-in-file must be a valid GPX file; input-file-name is your existing Streets & Trips, - Autoroute or Mappoint file; and output-file-name is the new Streets & Trips, Autoroute or Mappoint file. - GPS routes and tracks will be drawn as blue poly-lines, and waypoints will be imported as pushpins. - - -Q What is a template map, and how do I get one? - -A A template map is basically an empty map for your version of Streets & Trips, Autoroute or Mappoint, - which has been formatted for pushpins. )st2gpx cant import data into a map file unless it is formatted - for pushpins.) You can create one by starting with a new map (file\new) in Streets & Trips, Autoroute - or Mappoint. Create a single pushpin, then delete the pushpin again (this formats the map structure for - pushpins). Then save this file with a name like mappoint_2003_USA_template.ptm. - - -Q I would like to get the driving instructions, and detailed route, but st2gpx only saves the start/end and stops. - -A Unfortunately, the driving instructions are not saved in the file. You can add extra stops after the route - is calculated, or you can draw/trace a poly-line along the route calculated by Streets & Trips/Autoroute/Mappoint. - This is exported as a track (or optionally a route), and can then be loaded to your GPS receiver - using the correct software. I use an older Garmin GPS12 and loading a track this way works very well (I save as - pcx5 format and load via Garmin Mapsource. You may want to use GPSBabel to load directly to a Garmin or Magellan - or into a format that your GPS software understands). - - -Q How do I draw/trace a poly-line along the route? - -A You need to use the drawing toolbar. There are many different line types, but I find 'freeform' the best. - Begin with the entire route in view (or the part that you want to trace) and mark out the major points. - Then you can zoom in and add more detail by adding points or correct points by dragging them. - I find it best to add points at significant turns or intersections, and perhaps an extra point or two - near the intersection so the line direction of approach or exit from the intersection is accurate. - You can add many more points to get a very detailed trace of the route, but that may not be necessary. - Experiment, and see what works for you. - - -Q I get a error and no data in the GPX file. - -A First, make sure that you dont have the input or output file already open in Streets & Trips, Autoroute or - Mappoint file. Try downloading the latest version of st2gpx. If you still have problems, send me the error - message and the input file. - - \ No newline at end of file diff --git a/st2gpx/libexpat.dll b/st2gpx/libexpat.dll deleted file mode 100644 index 4c925de3579d7bc74ea0c85f4d096d0070e09da1..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 143360 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

o`}M#~TH!R_w*#*Mmjd$$ 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